import sys
from math import *

from PyQt5.QtWidgets import QDialog, QTextBrowser, QLineEdit, QVBoxLayout, QApplication


class Form(QDialog):
    def __init__(self, parent=None):  # 这是 不初始化父类，保证Form是顶级窗口
        super(Form, self).__init__(parent)  # 初始化父类，以使其属性可用
        self.browser = QTextBrowser()  # 为了在本函数之外能用，所以加上self,成为顶级窗口的属性
        """在可视控件的参数中，带上self表明了父子关系，
        如果后面会加入布局管理器，则可以省略，因为布局管理器会自动处理。
        """
        self.lineEdit = QLineEdit("Type an expression and press Enter")
        self.lineEdit.selectAll()

        layout = QVBoxLayout()
        layout.addWidget(self.browser)  # 加入属性管理器的控件，自动成为管理器的属下。
        layout.addWidget(self.lineEdit)
        self.setLayout(layout)

        self.lineEdit.setFocus()  # 有提示作用，但只要有输入立即清除原来的文字
        # 如果这一语句在布局之前，则失去焦点。

        self.lineEdit.returnPressed.connect(self.updateUI)

        self.setWindowTitle("Calculate")

    def updateUI(self):
        try:
            text = self.lineEdit.text()
            self.browser.append("%s = <b>%s</b>" % (text, eval(text)))
        except:
            self.browser.append("<font color=red> %s is invalid </font>" % text)
        finally:
            self.lineEdit.selectAll()
            self.lineEdit.setFocus()
            # 以上是我增加的，在保持选择状态和焦点状态


if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    sys.exit(app.exec())
